package cn.tedu.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*本类用于Arraylist的相关测试*/
public class TestArryList {
    public static void main(String[] args) {
        //1,创建对应的集合对象
        /*底层会自动帮我们创建数组来存放对象,并且数组的初始量为10*/
        ArrayList<Integer> list=new ArrayList<>();
        //2,向数组中添加元素
        list.add(100);
        list.add(200);
        list.add(300);
        list.add(400);
        list.add(300);
        list.add(400);
        System.out.println(list);
        //3,测试常用方法
       // list.clear();//清空集合
        //System.out.println(list);//[]

        //false,是否包含指定元素"100",不包含,这是String,不是Integer
        System.out.println(list.contains("100"));//false
        System.out.println(list.get(0));//100,获取下标
        System.out.println(list.indexOf(400));//3,判断元素第1次出现的位置
        System.out.println(list.lastIndexOf(300));//4,判断元素最后1次出现的位置
       // System.out.println(list.remove(300));//会报错
        /*上面的代码会报错:数组下标越界:index:300 ize:6
        * 主要是因为list中有两个重载的remove(),如果传入的是300
        * 会直接把这个300看作是int类型的index索引,所以如果想指定元素来删除数据
        * 需要把int类型的300手动装箱成Integer类型的300元素*/
        System.out.println(list.remove(Integer.valueOf(300)));//根据具体元素删除元素
        //System.out.println(list.remove(2));//根据下标删除元素
        System.out.println(list);
        System.out.println(list.set(2,777));//修改指定位置处的元素777
        System.out.println(list.size());//获取集合中的元素个数
        System.out.println(list);

        //测试集合间的操作
        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        list2.add(3);
        list2.add(4);
        System.out.println(list2);
        list.addAll(list2);
        System.out.println(list);//将list2中所以元素添加到list集合末尾
        list.addAll(0,list2);//将list2集合中的所以元素从list集合的0号位置开始添加
        System.out.println(list);
        System.out.println("111111111111111");
        list.removeAll(list2);
        System.out.println(list);
       // list.add(1);
        System.out.println(list);
        System.out.println(list.containsAll(list2));//判断list集合中是否包含list2的所有元素
        list.retainAll(list2);//取交集,保留list中属于list2的所有元素
        System.out.println(list);

        System.out.println("-----------------------");
        list.add(5);
        list.add(6);
        list.add(7);
        list.add(8);
        list.add(9);
        System.out.println(list);
        //测试集合的迭代
        /*1,我们可以通过for循环
        * 2,高效for循环
        * 3,iterator
        * 4,ListIterator*/
        //方式1:因为List集合是有序的,元素是有下标的,所以可以根据下标进行遍历
        //从哪开始:0  到哪结束:List.size()-1 如何变化++
        for(int i=0;i<=list.size()-1;i++){
            System.out.println(list.get(i));
        }
        System.out.println("----------方式1---------------");
        //方式2,因为普通for循环遍历效率低

        for (Integer n:list){
            System.out.println(n);
        }
        System.out.println("----------方式2---------------");

        //方式3:从父接口Collection中继承过来的迭代器
        //1,获取迭代集合的对应迭代器
        Iterator<Integer> it = list.iterator();
        //2,通过迭代器判断是否有下一个元素可以迭代
        while (it.hasNext()){
            //3,通过迭代器获取本轮迭代到的元素
            System.out.println(it.next());
        }
        System.out.println("-----------------方式3--------------");

        /*方式4,ListIterator属于List接口独有的迭代器
        * Iterator<E> --父接口--hasNext() next()
        * ListIterator<E> --子接口--可以使用父接口的功能,除了父接口的功能外
        * 还有自己特有功能,比如逆序遍历,添加元素等,单注意,不常用
        * public interface ListIterator<E> extends Iterator<E> */
        ListIterator<Integer> it2 = list.listIterator();
        while (it2.hasNext()){
            System.out.println(it2.next());

        }
        System.out.println("-----------------方式4--------------");

    }

}
